/**
 * 1、使用 Object.defineProperty 为对象定义属性
 * 2、描述对象属性的属性: value 、writable 、configurable 、enumerable
 * 3、使用 Object.getOwnPropertyNames 获得指定对象的自有属性
 */

let x = new Object();

let propertyDescriptor = {
    value: 1001 , /* 指定属性值 */
    writable: false , /* 明确属性值是否可以被修改 ( true 表示可以修改 ，false 表示不可修改 ) */
    configurable: false , /* 明确属性值是否可以被配置 ( true 表示可以 ，false 表示不可以 ) */
    enumerable: false /* 明确属性值是否可以被枚举 ( true 表示可以 ，false 表示不可以 ) */
}

// 为指定对象定义指定名称的属性，并指定该属性的相关特征
Object.defineProperty( x , 'id' , propertyDescriptor );

Object.defineProperty( x , 'name' , {
    value: '朱亚红' ,
    writable: false , /* 默认值是 false ，即不可被修改 */
    configurable: false , /* 默认值是 false ，即不可被配置 */
    enumerable: false /* 默认值是 false ，即不可被枚举 */
} );

Object.defineProperty( x , 'gender' , { value: '靓妹' } );

// 因为 x 的属性都是不可枚举的，所以这行输出不会看到结果
console.log( x ) ; // {}

x.id = 9009 ;
x.name = '秦雯雯' ;

console.log( x.id , x.name , x.gender );

console.log( Object.getOwnPropertyNames( x ) );

delete x.id ;
delete x.name ; // 若属性的 configurable 为 false 则无法删除
delete x.gender ;

console.log( Object.getOwnPropertyNames( x ) );
console.log( x.hasOwnProperty( 'id' ) );